import trainApi from 'api/train'
import api from 'api/trainingProgram'

const pattern = {
  email: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
  phone: /^1[3|4|5|6|7|8|9][0-9]{9}$/,
  mobile: /^1[3|4|5|6|7|8|9][0-9]{9}$/,
  familyPhone: /^0\d{2,3}-?\d{7,8}$/, // 座机
  password: /^[a-zA-Z0-9_]+$/,
  nickname: /^[A-Za-z0-9_、.\u4e00-\u9fa5]{4,20}$/,
  intadd: /^(0|[1-9][0-9]*)$/,
  ip: /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$/,
  username: /^[a-zA-Z\u4e00-\u9fa5\s]{1,20}$/,
  letterNumber: /^[0-9a-zA-Z]*$/,
  idNo: /^[A-Za-z0-9]+$/
}

export default {
  pattern,
  rule: {
    email: {
      pattern: pattern.email,
      message: '邮箱格式不正确'
    },
    phone: {
      pattern: pattern.phone,
      message: '电话号码格式不正确'
    },
    mobile: {
      pattern: pattern.mobile,
      message: '手机号码格式不正确'
    },
    password: {
      pattern: pattern.password,
      message: '密码格式不正确'
    },
    nickname: {
      pattern: pattern.nickname,
      message: '昵称格式不正确'
    },
    ip: {
      pattern: pattern.ip,
      message: '身份证号不合法'
    },
    username: {
      pattern: pattern.username,
      message: '姓名格式不正确'
    },
    isPhone: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.phone.test(value)) {
            callback()
          }
          callback(new Error('请输入正确的手机号!'))
        }
      }
    },
    isPhoneAndLandline: {
      validator (rule, value, callback) {
        if (value) {
          let Landline = /^0\d{2,3}-?\d{7,8}$/
          if (pattern.phone.test(value)) {
            callback()
          } else if (Landline.test(value)) {
            callback()
          }
          callback(new Error('请输入正确的手机号或座机号!'))
        }
      }
    },
    isEmail: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.email.test(value)) {
            callback()
          }
          callback(new Error('请输入正确的邮箱!'))
        }
      }
    },
    isPassword: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.password.test(value)) {
            callback()
          }
          callback(new Error('请输入格式正确的密码!'))
        }
      }
    },
    isIp: {
      validator (rule, value, callback) {
        if (value) {
          if (this.form.idType === 1) {
            if (value) {
              if (pattern.ip.test(value)) {
                callback()
              }
              callback(new Error('号码有误，请仔细核对后重新输入!'))
            }
          } else {
            callback()
          }
        } else {
          callback()
        }
      }
    },
    idNo: {
      pattern: pattern.idNo,
      message: '输入的证件号不符合规则'
    },
    account: { // phoneAndEmail
      validator (rule, value, callback) {
        if (value) {
          if (pattern.email.test(value) || pattern.phone.test(value)) {
            callback()
          }
          callback(new Error(this.message))
        }
      },
      message: '请输入正确的邮箱或者手机号!'
    },
    nickName: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.nickname.test(value)) {
            callback()
          }
          callback(new Error('请输入符合规范的昵称!'))
        }
      }
    },
    userName: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.username.test(value)) {
            callback()
          }
          callback(new Error('该姓名含非法字符，请使用中英文!'))
        } else {
          callback()
        }
      }
    },
    isIntadd: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.intadd.test(value)) {
            callback()
          }
          callback(new Error('请输入正整数!'))
        }
      }
    },
    emptyArray: { // 数组索引全为空校验
      validator (rule, value, callback) {
        if (value && value instanceof Array && value.some(item => { return !!item })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    NumberArray: {
      validator (rule, value, callback) {
        // console.log(value)
        if (value && value instanceof Array && value.every(item => {
          return item.channelsGroup.some(channel => {
            return channel.lotteryNumbers > 0 && pattern.intadd.test(channel.lotteryNumbers)
          })
        })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    saleArray: {
      validator (rule, value = [], callback) {
        // 改为只要有数量满足要求即可
        let numValidate = false // 默认不通过 如果有数量大于0 则通过
        let priceValidate = true // 默认通过 如果存在市场价小于求苗价 则不通过
        value.forEach(item => {
          if (item.num > 0) {
            numValidate = true
          }
          if (item.salePrice < item.price && item.salePrice > 0) {
            priceValidate = false
          }
        })
        if (numValidate && priceValidate) {
          callback()
        }
        if (!numValidate) {
          callback(new Error(this.numMsg))
        }
        if (!priceValidate) {
          callback(new Error(this.priceMsg))
        }
      },
      numMsg: '请输入数量,数量为正整数',
      priceMsg: '求苗价不能高于市场价'
    },
    channelArray: {
      validator (rule, { channelName, channelsGroup, key, isDefault = false }, callback) {
        /**
         * 1、先判断渠道名是否为空
         * 2、在判断渠道名是否重名
         * 3、最后判断数量是否符合要求
         * isDefault用来区分是否为默认渠道
         */
        let nameNullFlag = Boolean(channelName) // 渠道名是否为空
        if (!nameNullFlag) { // 渠道名空值
          callback(new Error(this.messageNullChannel))
        }
        // 是否有同名项
        let nameRepeatFlag = this.channelList.find(item => item.channelName === channelName && item.key !== key)
        if (nameRepeatFlag && !isDefault) { // 渠道名重名 不是默认渠道才判断是否重名
          callback(new Error(this.messageChannel))
        }
        // 各渠道数量是否全部为0 为0不能通过验证
        let numFlag = channelsGroup.some(channel => {
          return channel.lotteryNumbers > 0
        })
        if (!numFlag) { // 各渠道数量是否全部为0
          callback(new Error(this.messageNum))
        }
        callback()
      },
      channelList: [],
      messageNum: '请输入渠道名额,名额为正整数',
      messageChannel: '渠道名不能相同',
      messageNullChannel: '渠道名不能为空'
    },
    ticketTime: {
      validator (rule, value = {}, callback) {
        setTimeout(() => {
          if (value.startBuyTime && value.endBuyTime) {
            let startBuyTime = value.startBuyTime
            let endBuyTime = value.endBuyTime
            let showTime = Date.parse(value.name) // 场次时间
            let curTime = Date.parse(new Date()) // 当前时间
            // 购买结束时间 要小于场次时间
            if (endBuyTime > showTime) {
              callback(new Error('购买时间需要早于对应场次时间'))
            }
            if (startBuyTime < curTime) {
              callback(new Error('购买时间不能早于当前时间'))
            }
            callback()
          }
          callback(new Error('请选择购买起止时间'))
        }, 400)
      }
    },
    notNullArray: {
      validator (rule, value, callback) {
        if (value && value instanceof Array && value.every(item => { return !!item })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    orgArray: {
      validator (rule, value, callback) {
        if (value && value instanceof Array && value.some(item => {
          return item.length >= 2 && item.length <= 30
        })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    coOrgArray: {
      validator (rule, value, callback) {
        if (value && value instanceof Array && value.some(item => {
          return item.length === 0 || (item.length >= 2 && item.length <= 30)
        })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    checkTrim: {
      validator (rule, value, callback) {
        if (value) {
          if (value.trim().length >= 8) {
            callback()
          }
          callback(new Error(this.message))
        }
      },
      message: '不能为空'
    },
    amountNumber: {
      validator (rule, value, callback) {
        if (value) {
          // console.log(Number.isInteger(Number(value)))
          if (value >= 4 && value <= 8 && Number.isInteger(Number(value))) {
            callback()
          }
          callback(new Error(this.message))
        }
      }
    },
    isTwoPower: {
      validator (rule, value, callback) {
        if (value) {
          let isTwoPower = Math.log(value) / Math.log(2)
          // console.log(Number.isInteger(isTwoPower))
          if (Number.isInteger(isTwoPower) && isTwoPower > 0) {
            callback()
          }
          callback(new Error(this.message))
        }
      }
    },
    peopreRange: {
      validator (rule, value, callback) {
        if (value) {
          if (parseInt(value) >= 0 && parseInt(value) <= 100000) {
            callback()
          }
          callback(new Error(this.message))
        }
      }
    },
    venuesAddress: { // 上课地点
      validator (rule, value, callback) {
        if (value && value instanceof Array && value.some(item => {
          return item.address.length > 0
        })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    schoolNameExist: {
      validator (rule, value, callback) {
        console.log(this)
        if (!value) {
          callback()
        }
        trainApi.schoolNameValid({schoolName: value}).then((res) => {
          if (res.data === true) { // 校区名可用
            callback()
          }
          callback(new Error(this.message))
        })
      },
      message: '校区名称已存在'
    },
    cannotBeEmpty: { // 数组每一个都不能为空
      validator (rule, value, callback) {
        if (value && value instanceof Array && value.every(item => { return item.length > 0 })) {
          callback()
        }
        callback(new Error(this.message))
      },
      message: '不能为空'
    },
    letterNumber: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.letterNumber.test(value)) {
            callback()
          }
          callback(new Error('请输入字母或数字!'))
        }
      }
    },
    cannotBeZero: {
      validator (rule, value, callback) {
        if ((this.courseType === 2 && this.timesCourseCode.indexOf('C') > -1 && value <= 0) || (this.courseType === 1 && value <= 0)) {
          callback(new Error(this.message))
        }
        callback()
      },
      message: '付款金额需大于0'
    },
    idCard: {
      validator (rule, value, callback) {
        if (value) {
          if (pattern.ip.test(value)) {
            callback()
          }
          callback(new Error('身份证格式不正确!'))
        } else {
          callback()
        }
      }
    },
    customValidate: {
      validator (rule, value, callback) {
        if (value > 0 && value < this.min) {
          callback(new Error(`${this.type}不能小于${this.min}${this.unit}`))
        } else if (value > 0 && value > this.max) {
          callback(new Error(`${this.type}不能大于${this.max}${this.unit}`))
        } else {
          // value == 0 表示没有输入这一项，略过校验
          callback()
        }
      }
    },
    limitedHeight: {
      validator (rule, value, callback) {
        if (value) {
          if (this.form.height) {
            if (value) {
              if (value > 69 && value < 251) {
                callback()
              }
              callback(new Error('身高数值范围为70-250cm'))
            }
          } else {
            callback()
          }
        } else {
          callback()
        }
      }
    },
    limitedWeight: {
      validator (rule, value, callback) {
        if (value) {
          if (this.form.weight) {
            if (value) {
              if (value > 9 && value < 201) {
                callback()
              }
              callback(new Error('体重数值范围为10-200kg'))
            }
          } else {
            callback()
          }
        } else {
          callback()
        }
      }
    },
    limitedStandingReach: {
      validator (rule, value, callback) {
        if (value) {
          if (this.form.standingReach) {
            if (value) {
              if (value > 119 && value < 401) {
                callback()
              }
              callback(new Error('站立摸高数值范围为120-400cm'))
            }
          } else {
            callback()
          }
        } else {
          callback()
        }
      }
    },
    limitedArmReach: {
      validator (rule, value, callback) {
        if (value) {
          if (this.form.armReach) {
            if (value) {
              if (value > 69 && value < 301) {
                callback()
              }
              callback(new Error('臂展数值范围为70-300cm'))
            }
          } else {
            callback()
          }
        } else {
          callback()
        }
      }
    },
    checkTopic: {
      validator (rule, value, callback) {
        if (value) {
          api.checkTopicName({topicName: this.form.topic}, {context: this, errorMsg: 'none'}).catch(res => {
            callback(new Error(res.msg))
          }).then(() => {
            callback()
          })
        } else {
          callback()
        }
      }
    }
  }
}
